package top.sqdpt.pt.statemachine.action;

/**
 * 定义事件的行为
 *
 * @param <S> 状态枚举
 */
public interface PtStateAction<S extends Enum<S>> {

    /**
     * 守卫处理
     *
     * @param startState  开始状态
     * @param targetState 结束状态
     * @param context     上下文
     * @return 如果为true则会继续执行handle，如果为false则不会执行后续逻辑
     */
    default boolean guard(S startState, S targetState, Object context) {
        return true;
    }

    /**
     * 行为处理
     *
     * @param startState  开始状态
     * @param targetState 结束状态
     * @param context     上下文
     * @throws Exception 异常情况会触发onFail
     */
    void handle(S startState, S targetState, Object context) throws Exception;

    /**
     * 当前面的步骤抛出异常，则会触发onFail
     *
     * @param startState  开始状态
     * @param targetState 结束状态
     * @param context     上下文
     */
    default void onFail(S startState, S targetState, Object context, Exception e) throws Exception {
        throw e;
    }
}
